package com.atguigu.cloud.common.mail.configuration;

import com.atguigu.cloud.common.mail.entity.SysMailConfig;
import com.atguigu.cloud.common.mail.mapper.SysMailConfigMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import freemarker.template.Configuration;
import freemarker.template.TemplateExceptionHandler;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

import javax.mail.Session;
import java.io.IOException;
import java.util.Properties;

@org.springframework.context.annotation.Configuration
public class MailConfig {
    public static String myEmailAccount = "1114313006@qq.com";
    @Resource
    private SysMailConfigMapper sysMailConfigMapper;
    @Value("${template.path}")
    private String templatePath;

    /**
     * 获取邮件模板配置信息
     * @return
     */
    @Bean("templateConfiguration")
    public Configuration getConfiguration() {
        freemarker.template.Configuration cfg = new freemarker.template.Configuration(freemarker.template.Configuration.VERSION_2_3_31);
        try {
            cfg.setDirectoryForTemplateLoading(new java.io.File(templatePath)); // 指向模板目录的路径
            cfg.setDefaultEncoding("UTF-8");
            cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
            cfg.setLogTemplateExceptions(false);
            cfg.setWrapUncheckedExceptions(true);
            cfg.setFallbackOnNullLoopVariable(false);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return cfg;
    }
    /**
     * 获取邮箱发送配置信息 F
     * @return
     */
    @Bean("sysSendMailConfig")
    public SysMailConfig getSysSendMailConfig(){
        QueryWrapper<SysMailConfig> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("address",myEmailAccount)
                .eq("mailType","F");
        SysMailConfig sysMailConfig = sysMailConfigMapper.selectOne(queryWrapper);
        System.out.println(sysMailConfig.toString());
        return sysMailConfig;
    }
    /**
     * 获取邮箱接收配置信息 S
     * @return
     */
    @Bean("sysRecieveMailConfig")
    public SysMailConfig getSysRecieveMailConfig(){
        QueryWrapper<SysMailConfig> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("address",myEmailAccount)
                .eq("mailType","S");
        SysMailConfig sysMailConfig = sysMailConfigMapper.selectOne(queryWrapper);
        System.out.println(sysMailConfig.toString());
        return sysMailConfig;
    }
    /**
     * 配置邮件发送会话信息 F
     * @param sysMailConfig
     * @return
     */
    @Bean("mailSendSession")
    public Session getMailSendSession(@Qualifier("sysSendMailConfig") SysMailConfig sysMailConfig){
        // 1. 创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties();                    // 参数配置
        props.setProperty("mail.transport.protocol", sysMailConfig.getProtocol());   // 使用的协议（JavaMail规范要求）
        props.setProperty("mail.smtp.host", sysMailConfig.getHost());   // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
        props.setProperty("mail.smtp.ssl.enable", "true");            // 需要请求认证
        props.setProperty("mail.smtp.ssl.starttls.enable", "true");            // 需要请求认证
        props.setProperty("mail.smtp.ssl.starttls.required", "true");            // 需要请求认证
        props.setProperty("mail.smtp.port", sysMailConfig.getPort());
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", sysMailConfig.getPort());

        // 2. 根据配置创建会话对象, 用于和邮件服务器交互
        Session session = Session.getInstance(props);
        // 设置为debug模式, 可以查看详细的发送 log
        session.setDebug(true);
        return session;
    }
    /**
     * 配置邮件接收会话信息 S
     * @param sysMailConfig
     * @return
     */
    @Bean("mailRecieveSession")
    public Session getMailRecieveSession(@Qualifier("sysRecieveMailConfig") SysMailConfig sysMailConfig){
        // 1. 创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties();                    // 参数配置
        props.setProperty("mail.store.protocol", sysMailConfig.getProtocol());   // 使用的协议（JavaMail规范要求）
        props.setProperty("mail.imap.host", sysMailConfig.getHost());   // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.imap.auth", "true");            // 需要请求认证
        props.setProperty("mail.imap.ssl.enable", "true");            // 需要请求认证
        props.setProperty("mail.imap.ssl.starttls.enable", "true");            // 需要请求认证
        props.setProperty("mail.imap.ssl.starttls.required", "true");            // 需要请求认证
        props.setProperty("mail.imap.port", sysMailConfig.getPort());
        props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.imap.socketFactory.fallback", "false");
        props.setProperty("mail.imap.socketFactory.port", sysMailConfig.getPort());

        // 2. 根据配置创建会话对象, 用于和邮件服务器交互
        Session session = Session.getInstance(props);
        // 设置为debug模式, 可以查看详细的发送 log
        session.setDebug(true);
        return session;
    }
}
